package quartz;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

/**
 * @author zyy
 * @date 2021/1/14 下午6:15
 * @description
 */
public class QuartzMain {

    /**
     * 1.创建一个作业任务调度器（类似于公交调度站）
     * @return
     * @throws SchedulerException
     */
    public static Scheduler createScheduler() throws SchedulerException {
        StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        return  scheduler;
    }

    /**
     * 2.创建一个作业任务（类似于一个公交车）
     * @return
     */
    public static JobDetail createJob(){
        JobBuilder jobBuilder = JobBuilder.newJob(DemoJob.class);
        jobBuilder.withIdentity("jobName","myJob");
        JobDetail jobDetail = jobBuilder.build();
        return jobDetail;
    }

    /**
     * 3.创建作业任务时间触发类（类似于公交车的时间表）
     * cron表达式由七个位置组成，空格分隔
     * 1、Seconds（秒）  0~59
     * 2、Minutes（分）  0~59
     * 3、Hours（小时）  0~23
     * 4、Day of Month（天）1~31,注意有的月份不足31天
     * 5、Month（月） 0~11,或者 JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC
     * 6、Day of Week(周)  1~7,1=SUN或者  SUN,MON,TUE,WEB,THU,FRI,SAT
     * 7、Year（年）1970~2099  可选项
     *示例：
     * 0 0 11 * * ? 每天的11点触发执行一次
     * 0 30 10 1 * ? 每月1号上午10点半触发执行一次
     * @return
     */
    public static Trigger createTrigger(){
        //创建时间触发器
        CronTrigger cronTrigger = TriggerBuilder.newTrigger()
                .withIdentity("triggerName","myTrigger")
                .startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule("*/2 * * * * ?"))
                .build();
        return cronTrigger;
    }

    /**
     * main函数中开启定时任务
     * @param args
     */
    public static void main(String[] args) throws SchedulerException {
        // 1.创建一个作业任务调度器(类似于公交调度站)
        Scheduler scheduler = QuartzMain.createScheduler();
        // 2.创建一个任务（好比某一个公交车的出行）
        JobDetail job = QuartzMain.createJob();
        // 3.创建一个作业任务时间触发器(类似于公交⻋出⻋时间表)
        Trigger trigger = QuartzMain.createTrigger();
        // 4.使用调度器按照时间触发器执行这个作业任务
        scheduler.scheduleJob(job,trigger);
        scheduler.start();
    }
}
